package net

import (
	"log"
	"strings"
)

type HandlerFunc func(req *WsMsgReq, rsp *WsMsgRsp)

// account login|loginout
// 路由分组
type group struct {
	prefix     string
	handlerMap map[string]HandlerFunc
}

// AddRouter 添加路由 设置对应的处理方方
func (g *group) AddRouter(name string, handlerFunc HandlerFunc) {
	g.handlerMap[name] = handlerFunc
}

// Group 实例化 group
func (r *Router) Group(prefix string) *group {
	g := &group{
		prefix:     prefix,
		handlerMap: make(map[string]HandlerFunc),
	}
	r.group = append(r.group, g)
	return g
}

// 执行
func (g *group) exec(name string, req *WsMsgReq, rsp *WsMsgRsp) {
	// 获取对应的处理方法
	h := g.handlerMap[name]
	if h != nil {
		// 执行处理方法
		h(req, rsp)
	} else {
		// 网关
		h = g.handlerMap["*"]
		if h != nil {
			h(req, rsp)
		} else {
			log.Println("路由未定义！")
		}
	}
}

// Router 路由定义
type Router struct {
	// 多个组采用切片
	group []*group
}

// NewRouter 实例化Router
func NewRouter() *Router {
	return &Router{}
}

func (r *Router) Run(req *WsMsgReq, rsp *WsMsgRsp) {
	// 	req.Body.Name 路径 登录业务  account.login (account 组标识) login 路由标识
	strs := strings.Split(req.Body.Name, ".")
	prefix := ""
	name := ""
	if len(strs) == 2 {
		prefix = strs[0]
		name = strs[1]
	}
	for _, g := range r.group {
		if g.prefix == prefix {
			g.exec(name, req, rsp)
		} else if g.prefix == "*" {
			// 网关
			g.exec(name, req, rsp)
		}
	}
}
